package com.xc.hotelmgr.datapusherali.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.xc.hotelmgr.datapusherali.pojo.ali.redis.OurRatePlanPrice;
import com.xc.hotelmgr.datapusherali.pojo.ali.redis.RPAddPrice;
import com.xc.hotelmgr.datapusherali.pojo.mybatis.*;
import com.xc.hotelmgr.datapusherali.pojo.request.FzSendRates;
import com.xc.hotelmgr.datapusherali.pojo.request.PsMap;
import com.xc.hotelmgr.datapusherali.pojo.request.RsData;
import com.xc.hotelmgr.datapusherali.sdk.FzSdk;

import java.util.ArrayList;
import java.util.List;

public class FZUtil {

    /**
     * 酒店推送
     * @param htHotelinfo
     * @param appKey
     * @param sessionKey
     * @param secret
     * @return
     */
    public static String hotelSend(HtHotelinfo htHotelinfo, String appKey, String sessionKey, String secret) {
        int city = htHotelinfo.getCity();
        htHotelinfo.setHtPhysicalRooms(null);
        htHotelinfo.setStatus(0);
        htHotelinfo.setCity(htHotelinfo.getDistrict());
        htHotelinfo.setSessionKey(sessionKey);
        htHotelinfo.setSecret(secret);
        htHotelinfo.setAppKey(appKey);
        htHotelinfo.setChinaHotel(null);
        htHotelinfo.setVendor(null);
        htHotelinfo.setBrand(null);
        htHotelinfo.setStarLevel(null);
        String result = fzSendComm(htHotelinfo, "taobao.xhotel.add");
        if(!result.contains("xhotel_add_response")) {
            htHotelinfo.setCity(city);
            result = fzSendComm(htHotelinfo, "taobao.xhotel.add");
        }
        return result;
    }

    /**
     * 酒店信息删除
     * @param htHotelinfo
     * @param appKey
     * @param sessionKey
     * @param secret
     * @return String
     */
    public static String hotelDel(HtHotelinfo htHotelinfo, String appKey, String sessionKey, String secret) {
        htHotelinfo.setHtPhysicalRooms(null);
        htHotelinfo.setAppKey(appKey);
        htHotelinfo.setSecret(secret);
        htHotelinfo.setSessionKey(sessionKey);
        htHotelinfo.setVendor(null);
        htHotelinfo.setStarLevel(null);
        htHotelinfo.setBrand(null);
        // 调用飞猪接口删除
        return fzSendComm(htHotelinfo, "taobao.xhotel.delete");
    }

    /**
     * 酒店更新
     * @param htHotelinfo
     * @param appKey
     * @param sessionKey
     * @param secret
     * @return
     */
    public static String hotelUpdate(HtHotelinfo htHotelinfo, String appKey, String sessionKey, String secret) {
        htHotelinfo.setAppKey(appKey);
        htHotelinfo.setSecret(secret);
        htHotelinfo.setSessionKey(sessionKey);
        htHotelinfo.setVendor(null);
        htHotelinfo.setStarLevel(null);
        htHotelinfo.setBrand(null);
        htHotelinfo.setChinaHotel(null);
        return fzSendComm(htHotelinfo, "taobao.xhotel.update");
    }

    /**
     * 酒店上下架
     * @param htHotelinfo
     * @param appKey
     * @param sessionKey
     * @param secret
     * @param status
     * @return
     */
    public static String hotelStatus(HtHotelinfo htHotelinfo, String appKey, String sessionKey, String secret, int status) {
        htHotelinfo.setStatus(status);
        htHotelinfo.setAppKey(appKey);
        htHotelinfo.setSecret(secret);
        htHotelinfo.setSessionKey(sessionKey);
        htHotelinfo.setVendor(null);
        htHotelinfo.setStarLevel(null);
        htHotelinfo.setBrand(null);
        htHotelinfo.setChinaHotel(null);
        String result =  fzSendComm(htHotelinfo, "taobao.xhotel.update");
        if(result.contains("酒店不能更改城市信息")){
            htHotelinfo.setCity(htHotelinfo.getDistrict());
            result =  fzSendComm(htHotelinfo, "taobao.xhotel.update");
        }
        return result;
    }

    /**
     * 房型推送
     * @param htPhysicalRoom
     * @param appKey
     * @param secret
     * @param sessionKey
     * @return
     */
    public static String roomSend(HtPhysicalRoom htPhysicalRoom, String appKey, String sessionKey, String secret) {
        htPhysicalRoom.setAppKey(appKey);
        htPhysicalRoom.setSecret(secret);
        htPhysicalRoom.setSessionKey(sessionKey);
        htPhysicalRoom.setHtLogicRooms(null);
        // 调用飞猪接口推送
        return fzSendComm(htPhysicalRoom, "taobao.xhotel.roomtype.add");
    }

    /**
     * 房型删除
     * @param htPhysicalRoom
     * @param appKey
     * @param sessionKey
     * @param secret
     * @return
     */
    public static String roomDel(HtPhysicalRoom htPhysicalRoom, String appKey, String sessionKey, String secret) {
        htPhysicalRoom.setHtLogicRooms(null);
        htPhysicalRoom.setSessionKey(sessionKey);
        htPhysicalRoom.setSecret(secret);
        htPhysicalRoom.setAppKey(appKey);
        return fzSendComm(htPhysicalRoom, "taobao.xhotel.roomtype.delete.public");
    }

    /**
     * 房型更新
     * @param htPhysicalRoom
     * @param appKey
     * @param sessionKey
     * @param secret
     * @return
     */
    public static String roomUpdate(HtPhysicalRoom htPhysicalRoom, String appKey, String sessionKey, String secret) {
        htPhysicalRoom.setHtLogicRooms(null);
        htPhysicalRoom.setAppKey(appKey);
        htPhysicalRoom.setSecret(secret);
        htPhysicalRoom.setSessionKey(sessionKey);
        return fzSendComm(htPhysicalRoom, "taobao.xhotel.roomtype.update");
    }

    /**
     * 房型上下架
     * @param htPhysicalRoom
     * @param appKey
     * @param sessionKey
     * @param secret
     * @param status
     * @return
     */
    public static String roomStatus(HtPhysicalRoom htPhysicalRoom, String appKey, String sessionKey, String secret, int status) {
        htPhysicalRoom.setHtLogicRooms(null);
        htPhysicalRoom.setRoomStatus(status);
        htPhysicalRoom.setAppKey(appKey);
        htPhysicalRoom.setSecret(secret);
        htPhysicalRoom.setSessionKey(sessionKey);
        return fzSendComm(htPhysicalRoom, "taobao.xhotel.roomtype.update");
    }

    /**
     * 价格政策推送
     * @param htLogicRoom
     * @param appKey
     * @param sessionKey
     * @param secret
     * @return
     */
    public static String logicRoomSend(HtLogicRoom htLogicRoom, String appKey, String sessionKey, String secret) {
        int status = htLogicRoom.getStatus();
        if(status==0) {
            htLogicRoom.setStatus(1);
        }
        htLogicRoom.setAppKey(appKey);
        htLogicRoom.setSecret(secret);
        htLogicRoom.setSessionKey(sessionKey);
        String name = htLogicRoom.getRpName();
        if (name == null) {
            htLogicRoom.setRpName("全额预付");
        }
        htLogicRoom.setPaymentType(1);
        htLogicRoom.setHtDailyRooms(null);
        htLogicRoom.setVendor(null);
        htLogicRoom.setStatus(1);
        htLogicRoom.setCancelPolicyFrom("3");
        htLogicRoom.setBreakfastCal(null);
        htLogicRoom.setCancelPolicyCal(null);
//        htLogicRoom.setChannel("H,O");
        // 调用飞猪接口推送
        return fzSendComm(htLogicRoom, "taobao.xhotel.rateplan.add");
    }

    /**
     * 价格政策删除
     * @param htLogicRoom
     * @param appKey
     * @param sessionKey
     * @param secret
     * @return
     */
    public static String logicRoomDel(HtLogicRoom htLogicRoom, String appKey, String sessionKey, String secret) {
        htLogicRoom.setHtDailyRooms(null);
        htLogicRoom.setSessionKey(sessionKey);
        htLogicRoom.setSecret(secret);
        htLogicRoom.setAppKey(appKey);
        htLogicRoom.setVendor(null);
        return fzSendComm(htLogicRoom, "taobao.xhotel.rateplan.delete");
    }

    /**
     * 价格政策更新
     * @param htLogicRoom
     * @param appKey
     * @param sessionKey
     * @param secret
     * @return
     */
    public static String logicRoomUpdate(HtLogicRoom htLogicRoom, String appKey, String sessionKey, String secret) {
        htLogicRoom.setAppKey(appKey);
        htLogicRoom.setSecret(secret);
        htLogicRoom.setSessionKey(sessionKey);
        String name = htLogicRoom.getRpName();
        if (name == null) {
            htLogicRoom.setRpName("全额预付");
        }
        htLogicRoom.setPaymentType(1);
        htLogicRoom.setHtDailyRooms(null);
        htLogicRoom.setVendor(null);
        htLogicRoom.setStatus(1);
        htLogicRoom.setCancelPolicyFrom("3");
        htLogicRoom.setBreakfastCal(null);
        // 调用飞猪接口推送
        return fzSendComm(htLogicRoom, "taobao.xhotel.rateplan.update");
    }

    /**
     * 价格政策上下架
     * @param htLogicRoom
     * @param appKey
     * @param sessionKey
     * @param secret
     * @param status
     * @return
     */
    public static String logicRoomStatus(HtLogicRoom htLogicRoom, String appKey, String sessionKey, String secret, int status) {
        htLogicRoom.setAppKey(appKey);
        htLogicRoom.setStatus(status);
        htLogicRoom.setSecret(secret);
        htLogicRoom.setSessionKey(sessionKey);
        String name = htLogicRoom.getRpName();
        htLogicRoom.setPaymentType(1);
        htLogicRoom.setHtDailyRooms(null);
        htLogicRoom.setVendor(null);
        htLogicRoom.setStatus(1);
        htLogicRoom.setCancelPolicyFrom("3");
        // 调用飞猪接口推送
        return fzSendComm(htLogicRoom, "taobao.xhotel.rateplan.update");
    }

    /**
     * 价格库存推送
     * @param htDailyRooms
     * @param roomCode
     * @param rpCode
     * @param appKey
     * @param secret
     * @param sessionKey
     * @return String
     */
    public static String ratesSend(List<HtDailyRoom> htDailyRooms, Long roomCode, String rpCode, String appKey, String sessionKey, String secret) {
        // 价格计划推送 实体类拼凑成飞猪需要数据

        RsData rsData = new RsData();
        rsData.setUse_room_inventory(false);
        rsData.setInventory_price(htDailyRooms);

        FzSendRates fzSendRates = new FzSendRates();
        fzSendRates.setOut_rid(roomCode);
        fzSendRates.setRateplan_code(rpCode);
        fzSendRates.setData(rsData);
        fzSendRates.setLock_end_time("");
        fzSendRates.setLock_start_time("");

        List<FzSendRates> list = new ArrayList<>();
        list.add(fzSendRates);
        String pushData = JSON.toJSONString(list);

        PsMap psMap = new PsMap();
        psMap.setAppKey(appKey);
        psMap.setSecret(secret);
        psMap.setSessionKey(sessionKey);
        psMap.setRate_inventory_price_map(pushData);
        // 调用飞猪接口推送
        return fzSendComm(psMap, "taobao.xhotel.rates.increment");
    }

    /**
     * 加价计算
     * @param opCommPrices
     * @param opHtlPrices
     * @param opOurRateplanPrices
     * @param htDailyRoom
     * @return
     */
    public static int calcPrice(List<OpCommPrice> opCommPrices, List<OpHtlPrice> opHtlPrices, List<OpOurRateplanPrice> opOurRateplanPrices, HtDailyRoom htDailyRoom) {

        int originalPrice = htDailyRoom.getPrice();
        int newPrice = originalPrice;
        //如果原始价格为0，则价格为0
        if(originalPrice==0) {
            return 0;
        }

        //分销商酒店加价(如果配置了酒店加价，则优先执行酒店加价)
        for (OpHtlPrice opHtlPrice : opHtlPrices) {
            if(opHtlPrice.getChangePriceStart() <= originalPrice && originalPrice <= opHtlPrice.getChangePriceEnd()){
                newPrice = (int) (originalPrice * (1 +(float) opHtlPrice.getChangePricePercent() / 100) + opHtlPrice.getChangePriceAmount());
                if(newPrice > opHtlPrice.getHighestPrice()){
                    newPrice = opHtlPrice.getHighestPrice();
                }
                return newPrice;
            }
        }

        //自定义价格政策加价(如果没有配置酒店加价，配置了自定义价格政策加价，则执行自定义价格政策加价)
        for (OpOurRateplanPrice opOurRateplanPrice : opOurRateplanPrices) {
            if(opOurRateplanPrice.getChangePriceStart() <= originalPrice && originalPrice <= opOurRateplanPrice.getChangePriceEnd()){
                newPrice = (int) (originalPrice * (1 +(float) opOurRateplanPrice.getChargePricePercent() / 100) + opOurRateplanPrice.getChargePriceAmount());
                if(newPrice > opOurRateplanPrice.getHighestPrice()){
                    newPrice = opOurRateplanPrice.getHighestPrice();
                }
                return newPrice;
            }
        }

        //商通用加价(如果没有配置酒店加价和自定义价格政策加价，则执行商通用加价加价)
        for (OpCommPrice opCommPrice : opCommPrices) {
            if(opCommPrice.getChangePriceStart() <= originalPrice && originalPrice <= opCommPrice.getChangePriceEnd()){
                newPrice = (int) (originalPrice * (1 +(float) opCommPrice.getChargePricePercent() / 100) + opCommPrice.getChargePriceAmount());
                if(newPrice > opCommPrice.getHighestPrice()){
                    newPrice = opCommPrice.getHighestPrice();
                }
                return newPrice;
            }
        }
        return newPrice;
    }


    /**
     * 价量态增量更新推送
     * @param opCommPrices
     * @param opHtlPrices
     * @param ourRateplanPrices
     * @param htDailyRoom
     * @return
     */
    public static int calcSendRPSPrice(List<OpCommPrice> opCommPrices, List<OpHtlPrice> opHtlPrices, List<OurRatePlanPrice> ourRateplanPrices, HtDailyRoom htDailyRoom) {
        int originalPrice = htDailyRoom.getPrice();
        int newPrice = originalPrice;
        //如果原始价格为0，则价格为0
        if(originalPrice==0) {
            return 0;
        }

        //分销商酒店加价(如果配置了酒店加价，则优先执行酒店加价)
        for (OpHtlPrice opHtlPrice : opHtlPrices) {
            if(opHtlPrice.getChangePriceStart() <= originalPrice && originalPrice <= opHtlPrice.getChangePriceEnd()){
                newPrice = (int) (originalPrice * (1 +(float) opHtlPrice.getChangePricePercent() / 100) + opHtlPrice.getChangePriceAmount());
                if(newPrice > opHtlPrice.getHighestPrice()){
                    newPrice = opHtlPrice.getHighestPrice();
                }
                return newPrice;
            }
        }

        //自定义价格政策加价(如果没有配置酒店加价，配置了自定义价格政策加价，则执行自定义价格政策加价)
        for (OurRatePlanPrice opOurRateplanPrice : ourRateplanPrices) {
            if(opOurRateplanPrice.getChangePriceStart() <= originalPrice && originalPrice <= opOurRateplanPrice.getChangePriceEnd()){
                newPrice = (int) (originalPrice * (1 +(float) opOurRateplanPrice.getChargePricePercent() / 100) + opOurRateplanPrice.getChargePriceAmount());
                if(newPrice > opOurRateplanPrice.getHighestPrice()){
                    newPrice = opOurRateplanPrice.getHighestPrice();
                }
                return newPrice;
            }
        }

        //商通用加价(如果没有配置酒店加价和自定义价格政策加价，则执行商通用加价加价)
        for (OpCommPrice opCommPrice : opCommPrices) {
            if(opCommPrice.getChangePriceStart() <= originalPrice && originalPrice <= opCommPrice.getChangePriceEnd()){
                newPrice = (int) (originalPrice * (1 +(float) opCommPrice.getChargePricePercent() / 100) + opCommPrice.getChargePriceAmount());
                if(newPrice > opCommPrice.getHighestPrice()){
                    newPrice = opCommPrice.getHighestPrice();
                }
                return newPrice;
            }
        }
        return newPrice;
    }


    /**
     * 调用飞猪接口的方法
     * @param o
     * @param method
     * @return String
     */
    private static String fzSendComm(Object o, String method) {
        String pushData = JSON.toJSONString(o);
        JSONObject jsonObject = (JSONObject) JSONObject.parse(pushData);
        return FzSdk.req(method, jsonObject);
    }

    public static RPAddPrice parseRpUseAddPrice(String rpUseAddPrice) {
        RPAddPrice rpAddPrice = new RPAddPrice();
        String  usePriceType = rpUseAddPrice.substring(0,1);
        Constant.StoreRPUseAddPrice storeRPUseAddPrice = Constant.StoreRPUseAddPrice.getStatusByValue(usePriceType);
        rpAddPrice.setStoreRPUseAddPrice(storeRPUseAddPrice);
        rpAddPrice.setId(rpUseAddPrice.substring(1));
        return rpAddPrice;
    }
}

